package utils

import (
	"fmt"
	"sync"
	"time"
)

type UniqueNumberGenerator struct {
	mu        sync.Mutex
	counter   int64
	lastMilli int64
}

// NewUniqueNumberGenerator 创建生成器实例
func NewUniqueNumberGenerator() *UniqueNumberGenerator {
	return &UniqueNumberGenerator{}
}

// Generate 生成 15 位唯一数字
func (g *UniqueNumberGenerator) Generate() string {
	g.mu.Lock()
	defer g.mu.Unlock()

	// 获取当前时间戳（毫秒级）
	nowMilli := time.Now().UnixNano() / int64(time.Millisecond)

	// 如果时间戳相同，递增计数器
	if nowMilli == g.lastMilli {
		g.counter++
	} else {
		// 如果时间戳变化，重置计数器
		g.counter = 0
		g.lastMilli = nowMilli
	}

	// 拼接时间戳和计数器
	return formatUniqueNumber(nowMilli, g.counter)
}

// formatUniqueNumber 格式化唯一数字
func formatUniqueNumber(timestamp int64, counter int64) string {
	// 格式化计数器为 3 位数字，并拼接时间戳
	fullNumber := fmt.Sprintf("%d%03d", timestamp, counter)
	// 保留后 X 位
	if len(fullNumber) > 16 {
		return fullNumber[len(fullNumber)-16:]
	}
	return fullNumber
}
